/**
 * 任务路由
 */

const express = require("express");
const { check, query, body } = require("express-validator");

const {
  selectTask,
  insertTask,
  deleteTask,
  updateTask,
  updateTaskStatus,
  updateTaskMajor,
} = require("../services/taskService");
const router = express.Router();

/**
 * 查询任务
 */
router.get(
  "/selectTask",
  [
    query("currentPage")
      .notEmpty()
      .withMessage("当前页码不能为空")
      .isNumeric()
      .withMessage("当前页码必须是数字类型"),
    query("pageSize")
      .notEmpty()
      .withMessage("每页条数不能为空")
      .isNumeric()
      .withMessage("每页条数必须是数字类型"),
  ],
  selectTask
);

const insertOrUpdateValidator = [
  body("title")
    .isString()
    .withMessage("任务标题必须是字符串类型")
    .trim()
    .notEmpty()
    .withMessage("任务标题不能为空")
    .escape(),
  body("content").trim().notEmpty().withMessage("任务内容不能为空").escape(),
  // body("status").equals("1").withMessage("任务状态必须是1"),
  body("status").isNumeric().withMessage("任务状态必须是数字类型"),
  body("is_major")
    .notEmpty()
    .withMessage("是否重要不能为空")
    .custom((value) => {
      if ([0, 1].includes(value)) {
        return true;
      }
      throw new Error("is_major值必须为Number类型0或1");
    }),
  body("start_time").custom((value) => {
    if (isValidateTime(value)) {
      return true;
    }
    throw new Error("开始日期必须是YYYY-MM-DD HH:mm:ss格式");
  }),
  body("expire_time").custom((value) => {
    if (isValidateTime(value)) return true;
    throw new Error("结束日期必须是YYYY-MM-DD HH:mm:ss格式");
  }),
  body().custom((value, { req }) => {
    const startTime = new Date(req.body.start_time);
    const endTime = new Date(req.body.expire_time);
    if (startTime >= endTime) {
      throw new Error("结束日期必须晚于开始日期");
    }
    return true;
  }),
];
/**
 * 添加任务
 */
router.post("/insertTask", insertOrUpdateValidator, insertTask);

/**
 * 删除任务
 */
router.delete(
  "/deleteTask",
  [
    body("ids").isArray().withMessage("ids参数必须是数组类型"),
    body("ids").isLength({ min: 1, max: 10 }).withMessage("ids参数必须至少有一个元素"),
    body("ids.*").isInt().withMessage("ids数组中的每个元素必须是整型"),
  ],
  deleteTask
);

/**
 * 修改任务
 */
router.put(
  "/updateTask",
  [body("id").isInt().withMessage("id参数必须是整型"), ...insertOrUpdateValidator],
  updateTask
);

/**
 * 修改任务状态
 */
router.patch(
  "/updateTaskStatus",
  [
    body("id").isInt().withMessage("id参数必须是整型"),
    body("status").isInt().withMessage("status参数必须是整型"),
  ],
  updateTaskStatus
);

/**
 * 修改任务是否为重要
 */
router.patch(
  "/updateTaskMajor",
  [
    body("id").isInt().withMessage("id参数必须是整型"),
    body("is_major").isInt().withMessage("is_major参数必须是整型"),
  ],
  updateTaskMajor
);

/**
 * 验证时间 格式
 * @param {DateTime} dateTime YYYY-MM-DD HH:mm:ss
 */
function isValidateTime(dateTime) {
  const regex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
  return regex.test(dateTime);
}

module.exports = router;
